#pragma once

namespace gtl
{
	namespace pair
	{
		template<class _Ty1, class _Ty2>
		struct equal1st : public binary_function<pair<_Ty1, _Ty2>, pair<_Ty1, _Ty2>, bool>
		{
			bool operator()(const pair<_Ty1, _Ty2>& p1, const pair<_Ty1, _Ty2>& p2) const
			{
				return p1.first == p2.first;
			}
		};

		template<class _Ty1, class _Ty2>
		struct equal2nd : public binary_function<pair<_Ty1, _Ty2>, pair<_Ty1, _Ty2>, bool>
		{
			bool operator()(const pair<_Ty1, _Ty2>& p1, const pair<_Ty1, _Ty2>& p2) const
			{
				return p1.second == p2.second;
			}
		};

		template<class _Ty1, class _Ty2>
		struct less1st : public binary_function<pair<_Ty1, _Ty2>, pair<_Ty1, _Ty2>, bool>
		{
			bool operator()(const pair<_Ty1, _Ty2>& p1, const pair<_Ty1, _Ty2>& p2) const
			{
				return p1.first < p2.first;
			}
		};

		template<class _Ty1, class _Ty2>
		struct less2nd : public binary_function<pair<_Ty1, _Ty2>, pair<_Ty1, _Ty2>, bool>
		{
			bool operator()(const pair<_Ty1, _Ty2>& p1, const pair<_Ty1, _Ty2>& p2) const
			{
				return p1.second < p2.second;
			}
		};

		template<class _Ty1, class _Ty2>
		struct great1st : public binary_function<pair<_Ty1, _Ty2>, pair<_Ty1, _Ty2>, bool>
		{
			bool operator()(const pair<_Ty1, _Ty2>& p1, const pair<_Ty1, _Ty2>& p2) const
			{
				return p1.first > p2.first;
			}
		};

		template<class _Ty1, class _Ty2>
		struct great2nd : public binary_function<pair<_Ty1, _Ty2>, pair<_Ty1, _Ty2>, bool>
		{
			bool operator()(const pair<_Ty1, _Ty2>& p1, const pair<_Ty1, _Ty2>& p2) const
			{
				return p1.second > p2.second;
			}
		};
	} // end of namespace pair
} // end of namespace gtl